#include <my_header.h>
// 执行流程：主要首先2号信号被添加到信号集，而全程屏蔽信号添加了信号集
// 那么执行2号信号将不被执行，被阻塞，解除屏蔽之后会执行2号信号调用了函数
// 再次执行2号信号 会执行pause函数 最终结束进程
/* Usage: ./13_pause2 */
void func(int sig_val)
{
    printf("sig_val:%d\n", sig_val);
}
int main(void){                                  
    // 检测到2号信号执行 信号处理函数
    signal(SIGINT, func);

    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);    //2号信号添加到信号集

    //全程屏蔽信号
    sigprocmask(SIG_BLOCK, &set, NULL);
    sleep(5);   
    printf("block over\n");
    // 解除信号 若没有解除屏蔽 下方pause执行2号信号将无用
    sigprocmask(SIG_UNBLOCK, &set, NULL);
    
    // 再次执行二号信号会执行func
    printf("before pause\n");
    pause();
    printf("after pause\n");

    return 0;
}

#if 0
    如果使用sigprocmask，可以实现所谓的信号保护临界区，在临界区
当中执行代码的时候，此时产生的信号将会被阻塞，临界区结束的位
置只需要再使用sigprocmask即可。

    如果希望在临界区之后再次捕获信号，可以使用系统调用pause进行
捕获，即先使用sigprocmask解开信号阻塞，再调用pause函数,使进
程被阻塞,等待信号到来，进而捕捉信号。

    但是需要注意的是，如果是在临界区间产生了信号，当使用
sigprocmask解开信号阻塞时，却会直接执行信号处理流程，无法使
sigprocmask之后的pause函数就绪。因为在解除阻塞后，处于
sigprocmask函数之后的pause函数，此时进程还未进入到pause的
阻塞状态中。

    所以为了捕获期间产生的信号，一种策略就是将解除阻塞和等待信号
合并成一个原子操作，这就是sigsuspend
#endif
